home *** CD-ROM | disk | FTP | other *** search
- // SDown.cpp : アプリケーション用クラスの定義を行います。
- //
-
- #include "stdafx.h"
- #include "SDown.h"
- #include "SDownDlg.h"
-
- #ifdef _DEBUG
- #define new DEBUG_NEW
- #undef THIS_FILE
- static char THIS_FILE[] = __FILE__;
- #endif
-
- /////////////////////////////////////////////////////////////////////////////
- // CSDownApp
-
- BEGIN_MESSAGE_MAP(CSDownApp, CWinApp)
- //{{AFX_MSG_MAP(CSDownApp)
- // メモ - ClassWizard はこの位置にマッピング用のマクロを追加または削除します。
- // この位置に生成されるコードを編集しないでください。
- //}}AFX_MSG
- ON_COMMAND(ID_HELP, CWinApp::OnHelp)
- END_MESSAGE_MAP()
-
- /////////////////////////////////////////////////////////////////////////////
- // CSDownApp クラスの構築
-
- CSDownApp::CSDownApp()
- {
- // TODO: この位置に構築用のコードを追加してください。
- // ここに InitInstance 中の重要な初期化処理をすべて記述してください。
- }
-
- /////////////////////////////////////////////////////////////////////////////
- // 唯一の CSDownApp オブジェクト
-
- CSDownApp theApp;
-
- /////////////////////////////////////////////////////////////////////////////
- // CSDownApp クラスの初期化
-
- BOOL CSDownApp::InitInstance()
- {
- // 標準的な初期化処理
- // もしこれらの機能を使用せず、実行ファイルのサイズを小さくしたけ
- // れば以下の特定の初期化ルーチンの中から不必要なものを削除して
- // ください。
-
- #ifdef _AFXDLL
- Enable3dControls(); // 共有 DLL 内で MFC を使う場合はここをコールしてください。
- #else
- Enable3dControlsStatic(); // MFC と静的にリンクする場合はここをコールしてください。
- #endif
-
- CSDownDlg dlg;
-
- int nTime = 0;
- int nOption = 0;
- // Get commandline option
- if( !GetAppOption( &nTime, &nOption))
- return FALSE;
-
- int nResponse = IDOK;
-
- if( nTime > 0 )
- {
- dlg.m_nTime = nTime;
- dlg.m_nOption = nOption;
- m_pMainWnd = &dlg;
- nResponse = dlg.DoModal();
- }
-
- if (nResponse == IDOK)
- {
- // SE_SHUTDOWN_NAME権限をEnableし、NTをShutdownする
- if( EnablePrivilege(SE_SHUTDOWN_NAME) )
- {
- // とりあえず先に書きこみをする。
- Logging( _T("処理は正常に行われました。") );
-
- if (!ExitWindowsEx( nOption, 0 ))
- {
- Logging(_T("シャットダウンは拒否されました。"));
- }
- }
- else
- {
- Logging( _T("権限取得でエラーが発生しました。"));
- }
-
- // SE_SHUTDOWN_NAME権限をDisable
- DisablePrivilege(SE_SHUTDOWN_NAME);
- }
- else if (nResponse == IDCANCEL)
- {
- Logging(_T("シャットダウンは手動キャンセルされました。"));
- }
-
- // ダイアログが閉じられてからアプリケーションのメッセージ ポンプを開始するよりは、
- // アプリケーションを終了するために FALSE を返してください。
- return FALSE;
- }
-
- /////////////////////////////////////////////////////////////////////////////
- // 権限をEnableにする
- // (パラメータにて渡された権限をEnableにする)
- /////////////////////////////////////////////////////////////////////////////
- BOOL EnablePrivilege( LPTSTR privilege )
- {
- // Non NT
- OSVERSIONINFO ver;
- ver.dwOSVersionInfoSize = sizeof( ver );
- GetVersionEx( &ver );
- if( ver.dwPlatformId != VER_PLATFORM_WIN32_NT )
- return TRUE;
-
- BOOL bSuccess;
- HANDLE hToken;
- LUID luid;
- TOKEN_PRIVILEGES tokenPrivileges;
-
- // 本プロセスのアクセストークンを開いて変更可能にする
- bSuccess = OpenProcessToken( GetCurrentProcess(),
- TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
- &hToken);
- if( !bSuccess ) {
- //AfxMessageBox( "シャットダウンに失敗しました。\nOpenProcessToken()" );
- return FALSE;
- }
-
- // 権限に対する識別子を取得する
- bSuccess = LookupPrivilegeValue( 0, privilege, &luid );
- if( !bSuccess ) {
- //AfxMessageBox( "シャットダウンに失敗しました。\nLookupPrivilegeValue()" );
- return FALSE;
- }
-
- // 権限をEnableにする
- tokenPrivileges.PrivilegeCount = 1;
- tokenPrivileges.Privileges[0].Luid = luid;
- tokenPrivileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
- bSuccess = AdjustTokenPrivileges(hToken, FALSE, &tokenPrivileges, 0, 0, 0);
-
- // AdjustTokenPrivileges()は常にTRUEを返すのでGetLastError()にてチェックする
- if( GetLastError() != ERROR_SUCCESS ) {
- //AfxMessageBox( "シャットダウンに失敗しました。\nAdjustTokenPrivileges()" );
- return FALSE;
- }
- return TRUE;
- }
-
- /////////////////////////////////////////////////////////////////////////////
- // 権限をDisableする
- // (パラメータにて渡された権限をDisableする)
- /////////////////////////////////////////////////////////////////////////////
- BOOL DisablePrivilege( LPTSTR privilege )
- {
- // Non NT
- OSVERSIONINFO ver;
- ver.dwOSVersionInfoSize = sizeof( ver );
- GetVersionEx( &ver );
- if( ver.dwPlatformId != VER_PLATFORM_WIN32_NT )
- return TRUE;
-
- BOOL bSuccess;
- HANDLE hToken;
- LUID luid;
- TOKEN_PRIVILEGES tokenPrivileges;
-
- // 本プロセスのアクセストークンを開いて変更可能にする
- bSuccess = OpenProcessToken( GetCurrentProcess(),
- TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
- &hToken);
- if( !bSuccess ) {
- return FALSE;
- }
-
- // 権限に対する識別子を取得する
- bSuccess = LookupPrivilegeValue( 0, privilege, &luid );
- if( !bSuccess ) {
- bSuccess = LookupPrivilegeValue( 0, privilege, &luid );
- return FALSE;
- }
-
- // 権限をDisableする
- tokenPrivileges.PrivilegeCount = 1;
- tokenPrivileges.Privileges[0].Luid = luid;
- tokenPrivileges.Privileges[0].Attributes = 0;
- bSuccess = AdjustTokenPrivileges(hToken, FALSE, &tokenPrivileges, 0, 0, 0);
-
- // AdjustTokenPrivileges()は常にTRUEを返すのでGetLastError()にてチェックする
- if( GetLastError() != ERROR_SUCCESS ) {
- return FALSE;
- }
- return TRUE;
- }
-
- /////////////////////////////////////////////////////////////////////////////
- // オプションを収得する
- /////////////////////////////////////////////////////////////////////////////
- BOOL CSDownApp::GetAppOption( int* pnTime, int* pnOption )
- {
- // default value
- *pnTime = 30;
- *pnOption = EWX_POWEROFF;
-
- char string[256];
- char seps[] = " \t,";
- char *token;
- int nForce = 0;
-
- strncpy( string, (LPCTSTR)m_lpCmdLine, 255 );
-
- /* メッセージ大文字化 */
- for( char *p = string; p < string + strlen( string ); p++ )
- {
- if( islower( *p ) )
- *p = _toupper( *p );
- }
-
- /* 最初のトークンを取得します。 */
- token = strtok( string, seps );
- while( token != NULL )
- {
- /* "string" にトークンがなくなるまで繰り返します。 */
- // オプション
- if( (token[0] == '/') || (token[0] == '-') )
- {
- // TIME
- if( strcmp( &token[1], _T("T") ) == 0 )
- {
- token = strtok( NULL, seps );
- *pnTime = atoi( token );
- if( *pnTime < 1 )
- *pnTime = 0;
- }
- // SHUTDOWN OPTION
- else if( strcmp( &token[1], _T("PWOEROFF") ) == 0 )
- {
- *pnOption = EWX_POWEROFF;
- }
- else if( strcmp( &token[1], _T("SHUTDOWN") ) == 0 )
- {
- *pnOption = EWX_SHUTDOWN;
- }
- else if( strcmp( &token[1], _T("REBOOT") ) == 0 )
- {
- *pnOption = EWX_REBOOT;
- }
- // FORCE COMMAND
- else if( strcmp( &token[1], _T("F") ) == 0 )
- {
- *pnOption |= nForce;
- }
-
- // HELP
- else if( strcmp( &token[1], _T("?") ) == 0 )
- {
- AfxMessageBox( _T("usage:\n[/t]ime(sec.)]\n[/SHUTDOWN]or[/POWEROFF]or[/REBOOT]\n[/f]orce") );
- return FALSE;
- }
-
- else
- {
- AfxMessageBox( _T("option err\nTry /? option.") );
- return FALSE;
- }
- }
- /* 次のトークンを取得します。 */
- token = strtok( NULL, seps );
- }
- return TRUE;
- }
-
- /////////////////////////////////////////////////////////////////////////////
- // ログを書きこむ
- /////////////////////////////////////////////////////////////////////////////
- BOOL Logging( char* msg )
- {
- FILE *stream;
- char logfile[MAX_PATH + 14];
-
- if( !GetWindowsDirectory( logfile, MAX_PATH ))
- return FALSE;
-
- if( 0 == strcmp( &logfile[1], ":" ))
- strcat( logfile, _T("ASDown.log") );
- else
- strcat( logfile, _T("\\ASDown.log") );
-
- if( (stream = fopen( logfile, "w+" )) == NULL )
- return FALSE;
-
- // timestamp
- time_t mytime;
- time(&mytime);
- fprintf(stream, _T("AdminShutDown at %s"), ctime(&mytime));
-
- fprintf( stream, msg );
- fflush( stream );
- fclose( stream );
- return TRUE;
- }
-